package com.delio.server.pagos.contratos;

import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.delio.client.pagos.aportes.DescuentoAporte;
import com.delio.client.pagos.contratos.Contrato;
import com.delio.server.base.Conexion;
import com.delio.server.base.util.GxtGridPaginate;
import com.delio.server.pagos.aportes.Aportes;
import com.delio.server.series.Series;
import com.extjs.gxt.ui.client.data.BasePagingLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.ibatis.sqlmap.client.SqlMapClient;

public class Contratos {
	private static SqlMapClient sqlMap = null;
	public static Integer errorCode = 0;
	public static Integer errorCode2 = 0;

	@SuppressWarnings("unchecked")
	public static PagingLoadResult<Contrato> getPaginate(
			GxtGridPaginate paginate, Integer empleado_id) {
		sqlMap = Conexion.getSqlMap();
		paginate.setLimit();

		if (paginate.order.equals(""))
			paginate.order = " order by co.id desc";
		if (empleado_id != 0)
			paginate.condition = "and co.empleado_id=" + empleado_id;

		List<Contrato> data = null;
		try {

			data = sqlMap.queryForList("paginateContrato", paginate);

		} catch (SQLException e) {
			e.printStackTrace();

		}
		return new BasePagingLoadResult<Contrato>(data, paginate.offset,
				count(paginate));

	}

	public static Integer count(GxtGridPaginate paginate) {
		Integer cont = null;
		try {
			cont = (Integer) sqlMap.queryForObject("countContrato");

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return cont;

	}

	public static Integer getCount() {
		sqlMap = Conexion.getSqlMap();
		Integer cont = null;
		try {
			cont = (Integer) sqlMap.queryForObject("countTotal");

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return cont;
	}

	public static boolean save(Contrato co, List<DescuentoAporte> ids) {
		sqlMap = Conexion.getSqlMap();
		boolean respuesta = true;
		try {

			if (co.getId() != null) {

				sqlMap.update("updateContrato", co);
				if (ids != null)
					Aportes.save(ids, co.getId());

				setAsistencia(co);
				setControlPagos(co);

			} else {

				if (validarContrato(co.getEmpleado_id()) == 0) {
					co.setNumero(getNumeracion());
					sqlMap.insert("insertContrato", co);
					if (ids != null)
						Aportes.save(ids, co.getId());
					setAsistencia(co);
					setControlPagos(co);

				} else {
					errorCode = 3;
					respuesta = false;
				}
			}

		} catch (SQLException e) {

			if (e.getSQLState().equalsIgnoreCase("23505"))
				errorCode = 2;
			else
				e.printStackTrace();
			respuesta = false;
		}

		return respuesta;
	}

	public static boolean save(Contrato co) {
		sqlMap = Conexion.getSqlMap();
		boolean respuesta = true;
		try {

			if (co.getId() != null) {
				sqlMap.update("updateContrato", co);
				setAsistencia(co);
				setControlPagos(co);

			} else {

				if (validarContrato(co.getEmpleado_id()) == 0) {
					co.setNumero(getNumeracion());
					sqlMap.insert("insertContrato", co);
					setAsistencia(co);
					setControlPagos(co);

				} else {
					errorCode = 3;
					respuesta = false;
				}

			}

		} catch (SQLException e) {

			if (e.getSQLState().equalsIgnoreCase("23505"))
				errorCode = 2;
			else
				e.printStackTrace();
			respuesta = false;
		}

		return respuesta;
	}

	@SuppressWarnings("unchecked")
	public static boolean delete(Integer id) {

		boolean respuesta = true;

		sqlMap = Conexion.getSqlMap();
		try {
			if (id != null) {
				sqlMap.startTransaction();
				@SuppressWarnings("rawtypes")
				Map m = new HashMap(1);
				m.put("id", id);

				errorCode2 = (Integer) sqlMap.queryForObject("deleteContrato",
						m);
				sqlMap.commitTransaction();
				sqlMap.endTransaction();
			} else
				respuesta = false;

		} catch (SQLException e) {

			e.printStackTrace();

			respuesta = false;

		}
		return respuesta;

	}

	public static boolean deleteAll(String ids) {
		boolean respuesta = true;

		sqlMap = Conexion.getSqlMap();
		try {
			if (!ids.equals(""))
				sqlMap.delete("deleteAllContrato", ids);
			else
				respuesta = false;

		} catch (SQLException e) {
			e.printStackTrace();
			respuesta = false;

		}
		return respuesta;

	}

	private static String getNumeracion() {
		Series.sqlMap = sqlMap;

		return Series.actualizarNumeracion("numero");

	}

	// private static String getNumeracion(String numeroedit){
	// Series.sqlMap=sqlMap;
	// Series.ultimonumero=numeroedit;
	// return Series.actualizarNumeracion("numero");
	//
	// }

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private static void setAsistencia(Contrato co) {

		sqlMap = Conexion.getSqlMap();
		try {
			sqlMap.startTransaction();
			Map m = new HashMap(2);
			m.put("turno_id", co.getTurno_id());
			m.put("contrato_id", co.getId());
			sqlMap.update("setControlasistencias", m);
			sqlMap.commitTransaction();
			sqlMap.endTransaction();
		} catch (SQLException e) {

			e.printStackTrace();
		}

	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static boolean setControlPagos(Contrato co) {
		sqlMap = Conexion.getSqlMap();
		boolean respuesta = true;
		try {

			sqlMap.startTransaction();

			Map m = new HashMap(4);
			m.put("contrato_id", co.getId());
			m.put("tipocontrato_id", co.getTipocontrato_id());
			m.put("estadopago_id", 1);
			m.put("sueldo", co.getSueldo());

			sqlMap.update("insertPagoSueldos", m);
			sqlMap.commitTransaction();
			sqlMap.endTransaction();

		} catch (SQLException e) {
			e.printStackTrace();

			respuesta = false;
		}

		return respuesta;
	}

	@SuppressWarnings({ "unchecked" })
	private static Integer validarContrato(Integer empleado_id) {
		Integer validar = 0;
		sqlMap = Conexion.getSqlMap();
		try {
			sqlMap.startTransaction();
			@SuppressWarnings("rawtypes")
			Map m = new HashMap(1);
			m.put("empleado_id", empleado_id);

			validar = (Integer) sqlMap.queryForObject("validarcontrato", m);
			sqlMap.commitTransaction();
			sqlMap.endTransaction();

		} catch (SQLException e) {
			e.printStackTrace();
		}
		;
		return validar;
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static boolean terminarcontrato(Integer contrato_id, Date fecha){
		boolean respuesta=true;
		sqlMap=Conexion.getSqlMap();
		try{
			
			sqlMap.startTransaction();
			Map m=new HashMap(2);
			m.put("contrato_id",contrato_id);
			m.put("fecha", fecha);
			sqlMap.update("terminarcontrato",m);
			sqlMap.commitTransaction();
			sqlMap.endTransaction();
			
		}catch(SQLException e){
			e.printStackTrace();
			respuesta=false;
			
		};
	
		return respuesta;
	}
	
	
	
}
